#pragma once

#include"RBtreeIterator.h"

template<class K,class V>
class Map
{
	struct MapkeyOfT
	{
		const K& operator()(const pair<const K, V>& kv)
		{
			return kv.first;
		}
	};

public:
	typedef typename RBTree<K, pair<const K, V>, MapkeyOfT>::iterator iterator;
	typedef typename RBTree<K, pair<const K, V>, MapkeyOfT>::const_iterator const_iterator;

	iterator begin()
	{
		return _t.begin();
	}

	iterator end()
	{
		return _t.end();
	}

	pair<iterator, bool> Insert(const pair<const K, V>& kv)
	{
		return _t.Insert(kv);
	}

	V& operator[](const K& key)
	{
		pair<iterator, bool> ret = _t.Insert(make_pair(key, V()));
		return ret.first->second;
	}
private:
	RBTree<K, pair<const K, V>, MapkeyOfT> _t;
};

void test_map()
{
	int a[] = { 4, 2, 6, 1, 3, 5, 15, 7, 16, 14 };
	Map<int, int> m;
	for (auto e : a)
	{
		m.Insert(make_pair(e, e));
	}

	Map<int, int>::iterator it = m.begin();
	while (it != m.end())
	{
		//it->first++;
		it->second++;
		cout << it->first << ":" << it->second << endl;
		++it;
	}
	cout << endl;

	Map<string, int> countMap;
	string arr[] = { "a","c","b","c","a","a" };
	for (auto& e : arr)
	{
		countMap[e]++;
	}

	for (auto& kv : countMap)
	{
		cout << kv.first << ":" << kv.second << endl;
	}
}
